import pymysql
import sqlalchemy
import logging 
import pandas as pd
import click
from datetime import datetime

import urllib 
fh = logging.FileHandler(filename='import.log')
ch = logging.StreamHandler()
logging.basicConfig(level=logging.INFO, datefmt='%Y-%m-%d %H%M%S', handlers=[fh, ch])


# 默认的数据库连接配置
mysql_config = {
    'host': 'rm-wz92r8qt89c31fn40oo.mysql.rds.aliyuncs.com',
    'port': 3306,
    'user': 'bi_rw',
    'raw_password': "Xjz@&283*-)",
    'database': 'bi_all_in_one',
    'charset': 'utf8mb3',
    'password': urllib.parse.quote("Xjz@&283*-)")
}

# 原始密码（包含特殊字符，如 @）
# 对密码进行 URL 编码

def create_mysql_env(config=None):
    """初始化mysql引擎"""
    if config: # 使用传入的配置进行连接
        mysql_config.update(config)
        logging.info(f'mysql配置已更新，当前为: {mysql_config}')
    url =f"""mysql+pymysql://{mysql_config['user']}:{mysql_config['password']}@{mysql_config['host']}:{mysql_config['port']}/{mysql_config['database']}?charset={mysql_config['charset']}"""
    engine = sqlalchemy.create_engine(url) 
    return engine


# 执行当前py文件可传对应的参数
@click.command()
@click.option('--user_name', default=None, help='用户名')
@click.option('--password',  default=None, help='用户密码')
@click.option('--database',  default=None, help='数据库名')
@click.option('--table_name', default=None, help='目标表名称(默认值是tmp_{%Y%m%d%H%M%s})') # 传入表名需小写，大写可能模块不支持，会报错
def main(user_name=None, password=None,  table_name=None , database=None): 
    run_time = datetime.now().strftime('%Y%m%d%H%M%s')
    config = {}
    if user_name and password:
        config['username'] = user_name
        config['password'] = password
    elif user_name or password:
        logging.error("'user_name'和'password'必须同时指定，不能单独使用")
        exit(1)
    data_df = pd.read_excel(data_excel) #sheet_name设置传入excel文件sheet页面名称||sheet页面编号;不指定sheet页默认读取第一个sheet页面 不同文件读取 pandas调用不同的方法：read_excel，read_csv、read_json...
    logging.info(f'目标数据共{data_df.shape[0]}条')
    engine = create_mysql_env(config) # 使用输入的配置初始化链接
    table_name = table_name if table_name else f'tmp_{mysql_config["user"]}_{run_time}'
    logging.info(f'开始执行导入，目标表{table_name}')
    data_df.to_sql(con=engine, index=False, if_exists='fail', name=table_name, method='multi', chunksize=1000)
    logging.info('任务完成')
if __name__ == '__main__':
    data_excel = '/Users/xiaotya/Desktop/外呼5月接通明细.xlsx' #指定读取文件绝对路径（非加密文件）列名必须是英文格式
    main()
# 执行步骤（本机环境或者集群python环境）
# 1.指定修改data_df中pandas读取要导入数据库表的数据格式
# 2.指定修改data_excel读取文件的绝对路径，如果在集群执行，需要将文件上传后并指定路径
# 3.执行当前python文件 eg:python3 test_load_excel.py --table_name XXXXXXX (--user_name --password --table_name  --database 参数都可添加，随意配置，可不指定，默认)

